require "Reloading/ISReloadableWeapon"

ISRevolverWeapon =  ISReloadableWeapon:derive("ISRevolverWeapon");

--************************************************************************--
--** ISRevolverWeapon:initialise
--**
--************************************************************************--
function ISRevolverWeapon:initialise()

end

--************************************************************************--
--** ISRevolverWeapon:new
--**
--************************************************************************--
function ISRevolverWeapon:new()
	local o = {}
	--o.data = {}
	o = ISReloadableWeapon:new();
    setmetatable(o, self)
    self.__index = self
	return o;
end

--************************************************************************--
--** ISRevolverWeapon:isLoaded
--**
--** Returns whether or not the gun will fire when the mouse is next
--** clicked
--**
--************************************************************************--
function ISRevolverWeapon:isLoaded()
	return true;
end

--************************************************************************--
--** ISRevolverWeapon:isLoaded
--**
--** Action performed when a shot is fired. Should typically decrease
--** the current amount of ammo in the weapon
--**
--************************************************************************--
function ISRevolverWeapon:fireShot()
	self.chambers[currentChamber] = 0;
	self.rotateCylinder();
end

--************************************************************************--
--** ISRevolverWeapon:canReload
--**
--** Whether the character attempting to reload has the necessary
--** prerequisites to perform the reload action. Called prior to
--** the timed action and not to be confused with isReloadValid
--**
--************************************************************************--
function ISRevolverWeapon:canReload(chr)
	local chamberIsFull = true;
	-- loop through the chambers and check whether
	-- any are empty
	for t = 1, 6 do
		if(self.chambers[t] == self.EMPTY) then
			chamberIsFull = false;
			t = t+1;
		end
		if(chamberIsFull == false) then
			return true;
		end
	end
end

--************************************************************************--
--** ISRevolverWeapon:isReloadValid
--**
--** Function for the TimedAction that determines whether the reload
--** action is still valid. If the player does something that should
--** interrupt the action, this should return false
--**
--** @param char - the character performing the action. Must not be nil
--** @param square - not used
--**
--** @return true if the action may continue to be performed
--**
--************************************************************************--
function ISRevolverWeapon:isReloadValid(char, square)
	local weapon = char:getPrimaryHandItem();
	if(weapon ~= nil) then
		if(char:getInventory():FindAndReturn(getAmmoType(weapon)) ~= nil) then
			return true;
		end
	end
	return false;
end

--************************************************************************--
--** ISRevolverWeapon:reloadStart
--**
--** Function that should be performed upon the start of the timed action
--**
--** @param char - the character performing the action. Must not be nil
--** @param square - not used
--**
--************************************************************************--
function ISRevolverWeapon:reloadStart(char, square)
	reloadInProgress = true;
end

--************************************************************************--
--** ISRevolverWeapon:reloadPerform
--**
--** Function that should be performed upon successful completion of the
--** timed action
--**
--** @param char - the character performing the action. Must not be nil
--** @param square - not used
--**
--************************************************************************--
function ISRevolverWeapon:reloadPerform(char, square)
	local weapon = char:getPrimaryHandItem();
    char:playSound(self.insertRoundSound)
--	getSoundManager():PlayWorldSound(self.insertRoundSound, char:getSquare(), 0, 10, 1.0, false);
	local roundHasBeenInserted = false;
	while (roundHasBeenInserted == false) do
		if(self.chambers[self.currentChamber] == self.EMPTY) then
			setCylinderChamber(weapon, getCurrentCapacity(weapon), self.LIVE);
			roundHasBeenInserted = true;
		end
		self:rotateCylinder(weapon);
	end
	-- remove the necessary ammo
	char:getInventory():RemoveOneOf(self.ammoType);
	reloadInProgress = false;
end

--************************************************************************--
--** ISRevolverWeapon:rotateCylinder
--**
--** Increases the currentChamber by 1 making sure it never exceeds 6.
--** Attempting to increase past six restores the currentChamber value
--** to 1
--**
--************************************************************************--
function ISRevolverWeapon:rotateCylinder()
	self.currentChamber = self.currentChamber + 1;
	if(self.currentChamber > 6) then
		self.currentChamber = 1;
	end
end

--************************************************************************--
--** ISRevolverWeapon:spinCylinder
--**
--** Sets the currentChamber a random number between 1 and 6
--**
--************************************************************************--
function ISRevolverWeapon:spinCylinder()
	self.currentChamber = ZombRand(1, 6);
end
